﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add 2:sub \n");
//		printf(" 3:mul 4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		if ((input <= 4 && input >= 1))
//		{
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = (*p[input])(x, y);
//			printf("ret = %d\n", ret);
//		}
//		else if (input == 0)
//		{
//			printf("退出计算器\n");
//		}
//		else
//		{
//			printf("输⼊有误\n");
//		}
//	} while (input);
//	return 0;
//}



//回调函数改进减少冗杂代码：
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
void cacul(int (*p)(int,int))//函数指针实现回调函数
{
	int x, y;
	int s = 0 ;
	printf("请输入操作数: \n");
	scanf("%d%d", &x, &y);
	s = p(x, y);
	printf("预算结果为: %d\n", s);
}
int main()
{
	int input = 0;

	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择：");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			cacul(add);
			break;
		case 2:
			cacul(sub);
			break;
		case 3:
			cacul(mul);
			break;
		case 4:
			cacul(div);
			break;
		case 0:
			printf("已退出计算器");
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (input);
	return 0;
}